//
//  main.m
//  第一个OC类
//
//  Created by wenjim on 17/8/24.
//  Copyright © 2017年 WenJim. All rights reserved.
//

#import <Foundation/Foundation.h>

/*
 事物名称：iPhone
 属性  ： 颜色，型号，cpu，尺寸
 行为  ：打电话，发短信，上网
 
 C语言中函数分为声明和实现
 OC中定义一个类也分为声明和实现，以后在OC中定义类，就是写类的声明和实现
 */

// 1.如果编写类的声明
// 以 @interface 开头，@end结尾，然后再class name对应的地方写上 事物名称（类名）
// 注意：；类名的首字符必须为大写
// 声明一个类的目的就是为了告诉系统，我们这个类中有哪些属性和行为

// OC类声明中属性只能在写@interface和@end之间的{}中
// 注意：编写OC属性的时，将所有的属性名称前都加上_


// 类名后面的 :NSObject 是为了让我们的IPhone 类具备创建对象的能力
@interface IPhone : NSObject
{
    // 注意：默认情况下，OC对象中的属性是不能直接访问的
@public // 只要让类中的属性公开，以后就可以直接通过一个指向结构体的指针来操作对象中的属性
    float _model; // 型号
    int _cpu; // cpu
    double _size; // 尺寸
    int _color; // 颜色
}
@end

// 2.如何编写类的实现
// 以@implementation开头，以@end结尾，然后在class对应的地方写上声明的类的名称，必须和声明的类名一模一样
@implementation IPhone

// 行为的实现

@end

int main(int argc, const char * argv[]) {
    
    // 如何通过一个类来创建对象
    // 在OC中想要通过一个类来创建一个对象，必须给类发送一个消息（好比C语言中调用方法一样）
    // 如何发送消息？ 在OC中只要想要发送消息就先写上 [类名称／对象对象 方法名称];
    // 发送什么消息（调用什么方法） 可以创建一个对象呢？new
    
    /*
     只要通过一个类调用类的new方法，给类发送一个叫做new的消息之后，系统内部会做3件事情
     1. 为了IPhone类创建出来的对象分配存储空间
     2. 初始化IPhone类创建出来的对象中的属性
     3. 返回IPhone类创建出来的对象对应的地址
     */
    
    // 通过一个IPhone类型的指针接受了 IPhone对象的地址
    // 如果使用给一个指针保存了某一对象的地址，那我们称这个指针为某个类型的对象
    // 利用IPhone类型的指针保存了IPhone对象的地址，那我们就称IPhone类型的指针p为IPhone对象
    IPhone * p = [IPhone new];
    //    p.size = 4;
    p->_size = 3.5;
    p->_cpu = 2;
    p->_model = 3;
    p->_color =0;
    
    NSLog(@"size = %f, cpu = %i, model = %f, color = %i",p->_size,p->_cpu,p->_model,p->_color);
    
    // OC中的类本质就是一个结构体，所以p这个指针就是指向了结构体
    /*
     // C语言
     struct Person
     {
     int age;
     char * name;
     };
     struct Person sp;
     struct Person * sip = &sp;
     
     (*sip).age = 20;
     (*sip).name = "XMG";
     
     sip -> age = 20;
     sip -> name = "XMG";
     
     printf("age = %i, name = %s\n",sip -> age,sip -> name);
     */
    
    
    
    // 什么是用于保存地址的？指针
    int num;
    num = 0;
    int * number =  &num;
    
    return 0;
}
